package cn.tedu.DButil;

import java.io.*;
/*本类作为工具类提供序列化与反序列化操作*/
public class DButil {
    /**
     * 通用的序列化
     * @param e 要序列化的对象的对象
     * @param file 文件位置
     * @param <E> 泛型
     */
    public static  <E> void method( String file,E e) {
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
            objectOutputStream.writeObject(e);
            System.out.println("已通过序列化将学生信息保存到本地");
        } catch (IOException o) {
            o.printStackTrace();
        } finally {
            if (objectOutputStream != null) {
                try {
                    objectOutputStream.close();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }

    /**
     * 通用的反序列化 方式一通过泛型
     * @param file 文件位置
     * @param t 变量名字,只要是要反序列化的类的类型变量即可，可以不赋值
     * @param <T> 类型
     * @return
     */
    public static  <T> T method1(String file, T t) throws Exception {
        ObjectInputStream objectInputStream = null;
        T t1 = null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
            Object o = objectInputStream.readObject();
            t1 = (T) o;

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if ( objectInputStream!=null){
                objectInputStream.close();
            }
        }
        if (t1==null){
            throw new Exception("序列化失败");
        }else{
            return t1;
        }

    }

    /**
     * 通用的反序列化 通过反射
     * @param file 文件位置
     * @param clas 类的字节码
     * @param <T>
     * @return 要序列化的位置的对象
     */
    public static <T> T method2(String file, Class<T> clas) {
        ObjectInputStream objectInputStream = null;
        Object o = null;

        try {
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
            o = objectInputStream.readObject();


        } catch (Exception e) {
            System.out.println("文件位置找不到");
            e.printStackTrace();
        } finally {
            if (objectInputStream != null) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return clas.cast(o);
    }

}
